Спасибо за отличные ответы. Не один единственный ответ был действительно полным, поэтому я пишу здесь комбинацию всех ответов, которые помогли мне . Если вам нравится этот ответ, пожалуйста, проголосуйте за людей, которые за это отвечали.
Выводы
Модульные тесты (или, по крайней мере, модульные тесты в модуле unittest
) являются двоичными. Как говорит Гильерме Чапьевский, : они сработают или потерпят неудачу, промежуточного срока нет.
Таким образом, я пришел к выводу, что модульные тесты не совсем подходящий инструмент для этой работы. Кажется, что модульные тесты больше озабочены тем, что «все будет работать, никаких сбоев не ожидается» , и поэтому я не могу (или это нелегко) проводить недвоичные тесты.
Итак, модульные тесты не кажутся правильным инструментом, если я пытаюсь улучшить алгоритм или реализацию, потому что модульные тесты не могут сказать мне, насколько лучше одна версия по сравнению с другой (предположим, что обе они правильно выполнены, тогда оба пройдут все юнит-тесты).
Мое окончательное решение
Мое окончательное решение основано на идее Райбера и коде, показанном в wcoenen answer . Я в основном расширяю значение по умолчанию TextTestRunner
и делаю его менее многословным. Затем мой основной код вызывает два тестовых набора: критический, использующий стандартный TextTestRunner
, и некритический, с моей менее развернутой версией.
class _TerseTextTestResult(unittest._TextTestResult):
def printErrorList(self, flavour, errors):
for test, err in errors:
#self.stream.writeln(self.separator1)
self.stream.writeln("%s: %s" % (flavour,self.getDescription(test)))
#self.stream.writeln(self.separator2)
#self.stream.writeln("%s" % err)
class TerseTextTestRunner(unittest.TextTestRunner):
def _makeResult(self):
return _TerseTextTestResult(self.stream, self.descriptions, self.verbosity)
if __name__ == '__main__':
sys.stderr.write("Running non-critical tests:\n")
non_critical_suite = unittest.TestLoader().loadTestsFromTestCase(TestSomethingNonCritical)
TerseTextTestRunner(verbosity=1).run(non_critical_suite)
sys.stderr.write("\n")
sys.stderr.write("Running CRITICAL tests:\n")
suite = unittest.TestLoader().loadTestsFromTestCase(TestEverythingImportant)
unittest.TextTestRunner(verbosity=1).run(suite)
Возможные улучшения
Тем не менее, полезно знать, существует ли какая-либо среда тестирования с недвоичными тестами, например, Кэти Ван Стоун предложила . Возможно, я не буду использовать этот простой личный проект, но он может пригодиться в будущих проектах.